package com.example.servlet.controller;

import org.springframework.http.MediaType;
import org.springframework.ui.Model;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(path = "/requestParam")
public class RequestParamController {

    // 默认情况下，使用此注解的方法参数是必需的，但是您可以通过将 @RequestParam 注解的 required 标志设置为 false 来指定方法参数是可选的。也就是说，如果请求中没有传递该参数，则该方法将不会被调用。

    // 您可以使用 @RequestParam 注解将 Servlet 请求参数（即查询参数或表单数据）绑定到控制器中的方法参数。
    // @RequestParam 注解还可以用于处理 GET 请求的查询参数，通过 @RequestParam 注解将查询参数绑定到控制器中的方法参数。
    @GetMapping
    public String setupForm(@RequestParam("petId") int petId, Model model) {
        model.addAttribute("pet", "pet");
        return "index";
    }

    // @RequestParam 注解还可以用于处理 POST 请求的表单数据，通过 @RequestParam 注解将表单数据绑定到控制器中的方法参数。
    @PostMapping(path = "/process", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public String processForm(@RequestParam MultiValueMap<String, String> params) {
        // ...
        return "index";
    }

    // 表单数据应该使用@RequestParam读取，而不是使用@RequestBody，因为@RequestBody 无法始终可靠地使用，因为在 Servlet API 中，请求参数访问会导致请求体被解析，并且无法再次读取。
}
